package com.yuyunbo.hbase;

import com.yuyunbo.hbase.vo.HbasePageBean;
import com.yuyunbo.hbase.vo.HbaseQueryVo;

import java.util.List;

/**
 * @Author: yuyunbo-1154363414@qq.com
 * @Date: 2020/5/13 14:59
 * @Description:
 */
public interface HbaseApiService {
    /**
     * 单个提交实体数据到Hbase
     * @param hbaseModel
     */
    <T> void singlePut(HbaseModel<T> hbaseModel);

    /**
     * 批量提交数据 到habse
     * @param hbaseModel
     */
    <T> void multiplePut(HbaseModel<T> hbaseModel);

    /**
     * 批量异步put操作
     * @param hbaseModel
     */
    <T> void multiplePutAsync(HbaseModel<T> hbaseModel);

    /**
     * 表名,主键获取对应的数据
     * @param hbaseQueryVo
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> T singleGet(HbaseQueryVo hbaseQueryVo, Class<T> requiredType);

    /**
     * 表名,主键获取对应列的数据
     * @param hbaseQueryVo
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> T singleGetWithColumn(HbaseQueryVo hbaseQueryVo, Class<T> requiredType);

    /**
     * 根据表名,指定的主键,获取指定的列
     * @param hbaseQueryVo
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> List<T> multipleGet(HbaseQueryVo hbaseQueryVo, Class<T> requiredType);

    /**
     * 获取主键匹配前缀的列,会存在全表扫描,性能存在风险以及OOM,慎用
     * @param hbaseQueryVo
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> List<T> scanByPrefixFilter(HbaseQueryVo hbaseQueryVo, Class<T> requiredType);

    /**
     * 根据起始的主键，以及过滤条件查询pageSize 的数据行项目
     * @param hbaseQueryVo
     * @param <T>
     * @return
     */
    <T> HbasePageBean<T> queryListByParamForPage(HbaseQueryVo hbaseQueryVo, int pageSize, Class<T> requiredType);

}
